#include "fhum.h"
//这是在纯净空气下久置至少一小时后计算获得的MQ2电阻值
#define R0 		24329	
int cvalue = 0;

__IO uint16_t adc_value[4];



void adc_config(void)
{
    AFIO_RemapConfig(AFIOC, ADC_GPIO_Pin, 0);       // 初始化ADC通道7引脚
    Adc_powerOn();                                  // 打开ADC电源
    Adc_open(ADC_CHANNEL);                          // 开启ADC通道7
}


/**************************************************************
*功  能：	气敏传感器节点初始化
*参  数：	无
*返回值：	无
**************************************************************/
void Smoke_Init(void)
{
	adc_config();
}
/**************************************************************
*功  能：	气敏传感器节点模拟
*参  数：	无
*返回值：	无
**************************************************************/
char print_buf[20] = {0};
int Smoke_Test(void) 
{
    uint32_t adcx_temp = 0;
    
    #define SOIL_ADC_AIR      4020  // 干燥空气中的ADC值（对应0%湿度）
    #define SOIL_ADC_WATER    1800  // 纯水中的ADC值（对应100%湿度）
    
    adcx_temp = Adc_Measure(ADC_CHANNEL);        // 采集ADC值
    
    // 显示原始ADC值
    OLED_ShowInt32Num(70, 4, (uint32_t)adcx_temp, 4, 16);
    
    // 线性映射ADC值到0-100%湿度范围
    uint8_t humidityPercent = 0;
    if (adcx_temp <= SOIL_ADC_WATER) {
        humidityPercent = 100;  // 超过纯水值，视为100%湿度
    } else if (adcx_temp >= SOIL_ADC_AIR) {
        humidityPercent = 0;    // 低于干燥空气值，视为0%湿度
    } else {
        // 线性插值计算百分比（注意：ADC值与湿度成反比）
        uint32_t adcRange = SOIL_ADC_AIR - SOIL_ADC_WATER;
        uint32_t valueRange = SOIL_ADC_AIR - adcx_temp;
        humidityPercent = (valueRange * 100) / adcRange;
    }
    
    // 显示湿度百分比
    sprintf(print_buf, "Humi: %d%", humidityPercent);
    OLED_Show_Str(8, 6, print_buf, 16);
    return humidityPercent;
}